// pages/web_authorization/web_authorization.js
const request = require('../../utils/promise.js');
Page({
  /**
   * 页面的初始数据
   */
  data: {
    loginCode: "", // 获取网站登录的，code凭证
    scancodeTime: 0, // 扫码时间戳，10位
    authorizationFlag: false, // 是否显示确认授权按钮 (默认false:不显示)
    confirmCount: 0, // 确认登录不得超过3次，否则禁用
    successLogin: false, // 授权成功，已经登录
    initFlag: false, // 一开始不显示，初始化完成才显示。避免因为变量值改变，不同页面一闪而过
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (query) {
    this.handleFirstLoginAndQRCode(query);
  },

  /**
   * 先确保，使用者已登录小程序，再处理二维码
   */
  handleFirstLoginAndQRCode(query) {
    // 没有openId，表示未登录小程序
    if (!wx.getStorageSync('openId')) {
      wx.showToast({
        title: '加载中',
        icon: 'loading',
        duration: 30000,
        mask: true
      })

      wx.login({
        success: (res) => {
          // 发送 res.code 到后台换取 openId，以及基础用户信息
          if (res.code) {
            request.GET("/user/onLogin/code2Session", {
              code: res.code
            }).then(res => {
              // console.log('home js 登录获取 openId: ', res);
              if (res.data && res.data.success) {
                wx.setStorageSync('userId', res.data.userId); // 缓存用户id，如果第一次注册时id为-1
                wx.setStorageSync('username', res.data.username); // 缓存昵称, 如果第一次注册时为空
                wx.setStorageSync('avatarUrl', res.data.avatarUrl); // 缓存用户头像, 如果第一次注册时默认灰色头像
                wx.setStorageSync('openId', res.data.openId); // 缓存用户 openId

                // 小程序登录成功后，再处理登录二维码
                this.handleQRCode(query);
              }
              wx.hideToast();
            })
          } else {
            wx.showToast({
              title: '登录失败',
              icon: 'error',
              mask: true
            })
          }
        },
        complete: (res) => {
          setTimeout(function () {
            wx.hideToast();
          }, 1000)
        }
      })

    } else {
      // 小程序登录成功后，再处理登录二维码
      this.handleQRCode(query);
    }

  },

  /**
   * 微信小程序登录成功后(调用这个函数时，此时openId必定是有值的)，再处理登录二维码
   * @param {扫描二维码的参数} query 
   */
  handleQRCode(query) {
    // 获取到二维码原始链接内容
    const q = decodeURIComponent(query.q);
    // 获取用户扫码时间 UNIX 时间戳，10位
    const scanTime = parseInt(query.scancode_time);

    if (q != "undefined" && q.indexOf('?') != -1 && !isNaN(scanTime)) {
      // 二维码约定中，只有一个code参数，直接获得即可
      let code = q.split('?')[1].split('=')[1];
      /**
       * 检查内容包括：
       * 1、code是否与系统的值相同？避免伪造
       * 2、二维码是否被使用过？避免盗用
       * 3、二维码是否过期失效？避免长时间不操作
       */
      request.GET('/webQR/checkQRCode', {
        loginCode: code,
        scancodeTime: scanTime
      }).then(res => {
        if (res.data) {
          // 校验通过，则显示确认授权按钮
          this.setData({
            loginCode: code,
            scancodeTime: scanTime,
            authorizationFlag: true,
            initFlag: true
          });
        } else {
          // 校验不通过，也显示页面
          this.setData({
            initFlag: true
          });
        }
      })
    }else{
      // 校验不通过，也显示页面
      this.setData({
        initFlag: true
      });
    }

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 确认WEB网站登录授权
   */
  confirmAuthorization() {
    wx.showToast({
      title: '授权中',
      icon: 'loading',
      duration: 30000,
      mask: true
    })

    // 记录按钮点击次数
    let cCount = this.data.confirmCount;
    this.setData({
      confirmCount:(cCount+1)
    });

    // 凭证过期 或者 第一次使用小程序，则需要申请获得微信用户基本信息
    if (wx.getStorageSync('openId') && this.data.authorizationFlag && (!wx.getStorageSync('userId') || wx.getStorageSync('userId')==-1)) {
      // wx.getUserProfile 方式官方已弃用，需要改造为自己的方式
      // 暂时屏蔽
      wx.showToast({
        title: '小程序用户不存在，请先注册',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (wx.getStorageSync('openId') && this.data.authorizationFlag && (wx.getStorageSync('userId') && wx.getStorageSync('userId') != -1)) {
      // 已登录小程序的用户，满足WEB端扫码登录条件，插入授权成功数据
      this.successAuthorization();
    } else {
      wx.showToast({
        title: '授权失败',
        icon: 'error',
        duration: 2000,
        mask: true
      })
    }

  },

  /**
   * WEB扫描成功授权登录
   */
  successAuthorization(){
    const params = {
      loginCode:this.data.loginCode,
      scancodeTime:this.data.scancodeTime,
      userId:wx.getStorageSync('userId'),
      username:wx.getStorageSync('username')
    }

    request.POST('/webQR/updateSuccessAuthorization',params).then(res => {
      if(res.data){
        wx.showToast({
          title: '授权成功',
          icon: 'success',
          duration: 2000,
          mask: true
        })

        this.setData({
          successLogin:true
        });
      }else{
        wx.showToast({
          title: '授权失败',
          icon: 'error',
          duration: 2000,
          mask: true
        })
      }
    })
  },

  /**
   * 取消登录
   */
  cancelLogin() {
    // 点击行为触发，退出小程序
    wx.exitMiniProgram();
  }

})